// es6中扩展运算符（...）
// 功能：展开语法(Spread syntax)，可以在函数调用/数组构造时，将数组表达式或者 string 在语法层面展开；还可以在构造字面量对象时，将对象表达式按 key-value 的方式展开。
// 语法：
// 1. 函数调用：myFunction(...iterableObj);
// 2. 字面量数组构造或字符串：[...iterableObj, '4', ...'hello', 6];
// 3. 构造字面量对象时,进行克隆或者属性拷贝（ECMAScript 2018规范新增特性）：let objClone = { ...obj };

// 说明： 展开语法和 Object.assign() 行为是一致的，执行的都是浅拷贝(只遍历一层)。如果需要更深层次的拷贝，那么就会出问题。

// 1. 数组和对象的拷贝。
var arr1 = [1, 2, 3]
var arr2 = [...arr1]
arr2.push(4)

console.log(arr1 === arr2) // false
console.log(arr1) // [1,2,3]
console.log(arr2)// [1,2,3,4]
// 数组深拷贝

// 对象也是一样，也可以使用拓展运算符

// var obj1 = {
//   a: 1,
//   b: 2
// }
// var obj2 = { ...obj1 }
// console.log(obj2) // { a:1, b:2}

// console.log(obj1 === obj2)// false
// // 在这里你会发现，这是一个深拷贝，其实不然，实际上, 展开语法和 Object.assign() 行为一致, 执行的都是浅拷贝(只遍历一层)。

// 2. 构造字面量数组。
// var arr1 = [1, 2, 3]
// var arr2 = [4, 5, ...arr1]
// console.log(arr2)
// // [4,5,1,2,3]

// 3、字符串转数组。
// var demo = 'hello'
// var str = [...demo]
// console.log(str)
// // ["h", "e", "l", "l", "o"]

// 4. 在函数调用时使用拓展运算符。
function myFunction(x, y, z) {
  console.log(x + '' + y + '' + z)
}

var args = [0, 1, 2]
myFunction(...args)

// 5. 只能用于可迭代对象
// 扩展语法（除扩展属性外）只能应用于可迭代对象：

// var obj = { 'key1': 'value1' }
// var array = [...obj] // TypeError: obj is not iterable
